package controllers

import (
	"Bok/models"
	"Bok/services"
	"fmt"
	"net/http"

	"github.com/gin-gonic/gin"
)

// 定义接口
type UserController struct {
	userService services.UserService
}

// 构造函数
func NewUserController(service services.UserService) *UserController {
	return &UserController{userService: service}
}

// 实现接口

// 注册
func (c *UserController) RegisterController(ctx *gin.Context) {
	var user models.RegistryRequest
	if err := ctx.ShouldBindJSON(&user); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"参数错误": err.Error()})
	}
	if err := c.userService.RegisterService(&user); err != nil {
		ctx.JSON(http.StatusOK, gin.H{
			"code":    401,    // 401表示未授权
			"message": "注册失败", // 直接使用服务层返回的错误信息
			"data":    nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code":    200,     // 401表示未授权
		"message": "注册成功！", // 直接使用服务层返回的错误信息
		"data":    nil,
	})
}

// 登录
func (c *UserController) LoginController(ctx *gin.Context) {
	var req models.LoginInfo
	// 序列化
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusBadRequest, gin.H{"参数错误": err.Error()})
	}
	// 此时 拿到前端的数据了、
	// 验证 验证码

	// 验证密码（service中进行）
	// ...
	data, err := c.userService.LoginService(req)
	if err != nil {
		// 登录失败（如用户不存在、密码错误等）
		ctx.JSON(http.StatusOK, gin.H{
			"code":    401,         // 401表示未授权
			"message": err.Error(), // 直接使用服务层返回的错误信息
			"data":    nil,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code":    200,
		"message": "success",
		"data":    data,
	})

}

// 更改用户信息
func (c *UserController) EditUserController(ctx *gin.Context) {
	var req models.EditUserRequest
	// 获取请求体
	if err := ctx.ShouldBindJSON(&req); err != nil {
		ctx.JSON(http.StatusOK, gin.H{
			"code":    1,
			"message": err.Error(),
			"data":    nil,
		})
	}
	fmt.Println("controller:", req)
	fmt.Println(ctx.Get("Username"))
	fmt.Println(ctx.Get("Id"))
	fmt.Println(ctx.Get("LoginId"))
	// 传递给 service处理
	id, exit := ctx.Get("Id")
	if exit {
		data, err := c.userService.EditService(id.(uint), req)
		if err != nil {
			ctx.JSON(http.StatusOK, gin.H{
				"code":    401,
				"message": err.Error(),
				"data":    nil,
			})
		}
		ctx.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "success",
			"data":    data,
		})
	}

}

// 获取用户信息

func (c *UserController) GetUserController(ctx *gin.Context) {
	// 直接获取用户id

	id, exit := ctx.Get("Id")
	fmt.Println("id:", id)
	if exit {
		intId, _ := id.(uint)
		fmt.Println("uintId:", intId)
		data, err := c.userService.GetUserService(intId)
		if err != nil {
			ctx.JSON(http.StatusOK, gin.H{
				"code":    401,
				"message": "获取失败！",
				"data":    nil,
			})
			return
		}
		ctx.JSON(http.StatusOK, gin.H{
			"code":    200,
			"message": "获取成功",
			"data":    data,
		})
		return
	}
	ctx.JSON(http.StatusOK, gin.H{
		"code":    401,
		"message": "查询 id 失败，用户 token 失效，重新登录",
		"data":    nil,
	})

}
